// Promise 类核心逻辑实现

/**
 * 1. Promise 就是一个类， 在执行这个类的时候 需要执行一个执行器进去 执行器会立即执行
 * 2. Promise 中有三种状态， 分别为 成功（fulfilled）、失败（rejected）、等待（pending）
 *    pending -> fulfilled
 *    pending -> rejected
 * 3. revolve 和 reject函数是用来更改状态的
 *    resolve： fulfilled
 *    reject： rejected
 * 4. then方法内部做的事情就是判断状态
 *    如果状态是成功， 调用成功的回调函数
 *    如果状态是失败， 调用失败的回调函数
 *    then方法是被定义在原型对象中的
 * 5. then成功回调有一个参数，表示成功只会的值
 *    then失败回调有一个参数，表示失败后的原因
 * 7. then方法是可以被链式调用的， 
 *    后面的then方法的回调函数拿到值的是上一个then方法的回调函数的返回值
 * 8. 当then返回的是当前promise实例时就会出现调用链循环 
 *    需要判断上一个then返回的值是否是当前promise实例
 * 9. Promise执行器捕获异常
 *    then方法中各个状态捕获异常，并且错误需要在下一个then方法调用前捕获到
 * 10. then方法的参数是可选的 
 *     所以当then中没有调用的参数依旧需要将值依次向下传递
 * 11. 实现promise的all方法, 是一个静态方法 接收一个数组作为参数，
 *     在执行过程中只要有一个获取到失败，就返回错误原因
 *     只有所有promise都执行完后，才以数组的形式返回成功
 * 12. 实现promise.reslove方法，resolve将给定的值转化为promise对象， 即返回值是一个promise对象
 * 13. 实现promise实例的finally方法
 *     无论promise的状态是成功的还是失败的，finally方法都会被执行一次
 *     可在finally方法后面链式调用then方法来拿到当前promise对象最终返回的结果
 *     允许finally返回promise或普通值， 如果返回中有异步的情况，需要等待异步任务执行后才向then传递返回值
 * 14. 实现promise类中的catch方法
 *     处理当前promise对象最终状态为失败的情况
 */

const { result } = require('lodash')
const MyPromise = require('./myPromise')
const myPromise = require('./myPromise')

 const promise = new myPromise((resolve, reject)=>{
    // setTimeout(() => {
    //     resolve('成功...')
    // }, 2000);
    // throw new Error('executor error')
    resolve('成功')
    //  reject('失败')
 })

//  promise
//  .then()
//  .then()
//  .then(value=>{
//      throw Error('this is a error')
//      console.log(value)
//  }, reason=>{
//      console.log(reason)
//  }).then(value=>{
//     console.log(value)
// }, reason=>{
//     console.log(reason)
// })

 function other (){
     return new MyPromise((resolve,reject)=>{
         resolve('other')
     })
 }

 function p1 () {
    return new MyPromise((resolve,reject)=>{
        setTimeout(()=>{
            // resolve('p1')
            reject('p1 reject')
        }, 2000)
    })
 }
//  myPromise.all(['a', 'b',p1(), other(), 'c' ]).then(result=>console.log(result))
//  myPromise.resolve('a').then(value=>console.log('resolve fun',value))

other().finally(()=>{
    console.log('finally')
    return p1()
}).then(value=>{
    console.log(value)
}, reason=>{
    console.log(reason)
})

// promise.then(value=>{
//     console.log(value)
//     return 2000
// }, reason=>{
//     console.log(reason)
    
// }).then(value=>{
//     console.log('then2:', value)
// },reason=>{
//     console.log('aaa')
//     console.log(reason.message)
// })
// promise
//     .then()
//     .then()
//     .then(value=>{console.log(value)}, reason=>{console.log(reason)})

